2011-01-12 3 views
1

Сценарий:Java EE/GlassFish - Темы и соединения

Я использую Java SE в течение некоторого времени, работа с потоками и т.д., хотя у меня есть небольшой опыт работы с Java EE.

У меня есть сторонняя библиотека Java, которая подключается к удаленному серверу (в сторонней компании). Библиотека создает несколько потоков и сама поддерживает соединение. Мне не разрешено открывать новые соединения снова и снова (путем создания новых экземпляров библиотеки). Мне нужно сохранить тот же экземпляр библиотеки, который будет поддерживать соединение в любое время.

Это довольно легко в приложении Java SE.

Теперь я хочу создать веб-сервис (возможно, используя GlassFish или аналогичный) для внутреннего использования в моей компании, чтобы иметь возможность использовать функциональные возможности этой библиотеки с ее подключением. Другими словами, мне нужно, чтобы пользовательские удаленные соединения (которые не создавались или управлялись моим кодом) не поддерживались между экземплярами запроса.

Вопрос: Можно ли достичь? Если да, то какую технологию я должен рассмотреть?

+0

Вы имеете в виду соединение с БД ?? –

+0

Нет, это проприетарное соединение со сторонним сокетом. Я не могу использовать JDBC или что-то в этом роде. –

ответ

2

вы можете сделать это с помощью пула соединений. Когда требуется подключение к удаленному серверу, получите соединение из этого пула вместо создания экземпляра каждый раз. Это поможет вам в улучшении памяти и эффективности работы с памятью. Если соединение отсутствует вы можете вернуть соединение в пул.

+0

Ну, я не тот, кто создает связи. Проприетарная библиотека создает потоки и открывает соединения. Извините, если я не понял. –

+1

Если это так, вы можете вызвать метод в этой библиотеке, но убедитесь, что вызов методов в библиотеке является singleton.What, я пытаюсь сказать, получить ссылку на этот объект библиотеки и проверить, уже ли соединение Если это так, верните одно и то же соединение (или нет необходимости в удаленном вызове). Продолжайте искать новое соединение. Таким образом вы можете эффективно использовать эту библиотеку. Я не говорю о пуле соединений здесь – UVM

+1

На самом деле я пробовал что-то похожее на начало, но это не сработало. Потоки продолжали работать, но опечатка в моем коде приводила к тому, что она не работала. Я нашел это, хотя, и хранение библиотеки как статического синглтона действительно работает! Сама библиотека является потокобезопасной, и я синхронизировал фабричный метод для создания библиотеки изначально. Для вас, других читателей, это не оптимальное решение для совместного использования ресурсов. Он работает в моем случае, но это не сработает, если вы, например, имеете несколько серверов приложений и хотите обмениваться данными между ними. –

1

Недавно я реализовал аналогичную систему, используя Tomcat в качестве контейнера Servlet и Metro 2.0 в качестве реализации JAX-WS. Мой сервис поддерживает соединения сокетов с базовыми компонентами (реализованы на C++) и связывается с ними с использованием проприетарного сетевого протокола.

Я использовал поток «Component Manager» для управления высокоуровневой связью с компонентами (установление соединения, подтверждение связи и т. Д.) И поток «Network Selector», который управлял фактической связью с компонентами. Этот «Сетевой селектор» использует асинхронные неблокирующие сокеты с использованием семейства классов Java Socket Selector - использование одного потока для взаимодействия с классом Socket Selector является важным моментом, поскольку некоторые платформы Java обнаруживают ошибки при использовании нескольких потоков.

Он работает очень хорошо до сих пор, поэтому я могу сказать вам, что это, безусловно, возможно. Если вам требуются какие-либо разъяснения, пожалуйста, напишите здесь или напишите мне (см. Мой профиль).

+0

Спасибо за ваш невероятно быстрый ответ! Однако я сам не контролирую связи. Проприетарная библиотека создает потоки и открывает соединения.Фактически, эти потоки, похоже, работают между экземплярами запроса, но я не уверен, как я могу поделиться ссылкой на экземпляр библиотеки без ее сериализации. –

+0

О да, может быть, даже проще - возможно, вам понадобится «Диспетчерский поток» для управления этими потоками соединений. Главное, что вам нужно создать поток во время инициализации, который будет управлять бэкэнд-ресурсами независимо от рабочего процесса запроса/ответа. – trojanfoe

+0

Еще раз спасибо за отличные ответы. –

0

Необходимо иметь фабрику, поддерживающую соединения, а затем предоставлять ее через JNDI так же, как и пулы соединений JDBC.

Затем вам необходимо убедиться, что соединения возвращены на заводскую установку, а затем интегрируйте их в жизненный цикл сервера приложений, чтобы он программно был выдвинут вверх и вниз.

Обратите внимание, что здесь существует неприятная проблема загрузчика классов, если вы не будете осторожны. У вас должен быть общий класс на заводе и на клиентах, и если он не входит в стандартную библиотеку времени выполнения, вам нужно будет выяснить способ его правильного обмена, если вы не хотите использовать отражение, чтобы перейти к методам.

+0

Привет, Thorbjørn! В чем преимущество совместного использования фабрики с JNDI вместо того, чтобы просто хранить ее как статическую ссылку? В настоящее время это работает нормально. Я говорю фабрике сторонних производителей о создании/удалении соединений, когда контекст инициализируется/уничтожается через ServletContextListener. –

+0

В зависимости от того, можно ли ожидать, что пул будет существовать в том же загрузчике классов, что и ваш код. Очевидно, он работает для вас :) –